/*-----------------------------------------------------------------------------
 * @file   hal_gpio.c
 * @brief  interface for GPIO module operations
 * @author WLH<wanglehui8357@163.com> Copyright (C) 2021~2099.
 ----------------------------------------------------------------------------*/
#include "hal_gpio.h"
#include "board.h"

/*-----------------------------------------------------------------------------
 * marcro define
-----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
 * local variable
-----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
 * local functions
-----------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------
 * public functions
-----------------------------------------------------------------------------*/
void hal_gpio_init(void)
{
    /* Enable the Tamper key GPIO clock */
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_GPIOB);
    rcu_periph_clock_enable(RCU_GPIOC);
    rcu_periph_clock_enable(RCU_SYSCFG);

    /* PA15 PB03 PC14 PC15      */
    gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_15);
    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_3 );
    gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_14);
    gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_15);

    /* configure GPIO as input  */
    gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_4);
    gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_8);
}
  
void hal_gpio_set(U8 pin)
{
    if (pin == HAL_GPIO_PIN_0)
    {
        gpio_bit_set(GPIOB, GPIO_PIN_3);
    }
    else if (pin == HAL_GPIO_PIN_1)
    {
        gpio_bit_set(GPIOA, GPIO_PIN_15);
    }
    else if (pin == HAL_GPIO_PIN_2)
    {
        gpio_bit_set(GPIOC, GPIO_PIN_14);
    }
    else if (pin == HAL_GPIO_PIN_3)
    {
        gpio_bit_set(GPIOC, GPIO_PIN_15);
    }
    else
    {
        // Handle invalid pin case
    }
}

void hal_gpio_reset(U8 pin)
{
    if (pin == HAL_GPIO_PIN_0)
    {
        gpio_bit_reset(GPIOB, GPIO_PIN_3);
    }
    else if (pin == HAL_GPIO_PIN_1)
    {
        gpio_bit_reset(GPIOA, GPIO_PIN_15);
    }
    else if (pin == HAL_GPIO_PIN_2)
    {
        gpio_bit_reset(GPIOC, GPIO_PIN_14);
    }
    else if (pin == HAL_GPIO_PIN_3)
    {
        gpio_bit_reset(GPIOC, GPIO_PIN_15);
    }
    else
    {
        // Handle invalid pin case
    }
}

void hal_gpio_toggle(U8 pin)
{
    if (pin == HAL_GPIO_PIN_0)
    {
        gpio_bit_toggle(GPIOB, GPIO_PIN_3);
    }
    else if (pin == HAL_GPIO_PIN_1)
    {
        gpio_bit_toggle(GPIOA, GPIO_PIN_15);
    }
    else if (pin == HAL_GPIO_PIN_2)
    {
        gpio_bit_toggle(GPIOC, GPIO_PIN_14);
    }
    else if (pin == HAL_GPIO_PIN_3)
    {
        gpio_bit_toggle(GPIOC, GPIO_PIN_15);
    }
    else
    {
        // Handle invalid pin case
    }
}

U8 hal_gpio_read(U8 pin)
{
    U8 ret = 0u;
    if (pin == HAL_GPIO_PIN_0)
    {
        ret = (U8)gpio_output_bit_get(GPIOB, GPIO_PIN_3);
    }
    else if (pin == HAL_GPIO_PIN_1)
    {
        ret = (U8)gpio_output_bit_get(GPIOA, GPIO_PIN_15);
    }
    else if (pin == HAL_GPIO_PIN_2)
    {
        ret = (U8)gpio_output_bit_get(GPIOC, GPIO_PIN_14);
    }
    else if (pin == HAL_GPIO_PIN_3)
    {
        ret = (U8)gpio_output_bit_get(GPIOC, GPIO_PIN_15);
    }
    else if (pin == HAL_GPIO_PIN_4)
    {
        ret = (U8)gpio_input_bit_get(GPIOB, GPIO_PIN_4);
    }
    else if (pin == HAL_GPIO_PIN_5)
    {
        ret = (U8)gpio_input_bit_get(GPIOB, GPIO_PIN_8);
    }
    else
    {
        // Handle invalid pin case
    }
    
    return ret;
}

U8 hal_gpio_out_count(void)
{
    return 4;
}

U8 hal_gpio_in_count(void)
{
    return 2;
}

void hal_gpio_exti_init(EXTI_HANDLER cb, U8 pin, EXTI_TYPE it_type)
{
    //
}

/*!
    \brief      this function handles external lines 10 to 15 interrupt request
    \param[in]  none
    \param[out] none
    \retval     none
*/
void EXTI10_15_IRQHandler(void)
{
    if (RESET != exti_interrupt_flag_get(EXTI_13))
    {
        exti_interrupt_flag_clear(EXTI_13);
    }
}
